#include <stdio.h>

//extern int a = 10;默认外部链接
int a = 10; 

//静态全局变量是内部链接
static int b = 20; //静态区

//内部链接和外部链接有什么区别?
//1.如果变量是内部链接的话,那么此变量只能在当前文件内访问
//2.如果变量是外部链接的话,那么此变量可以被其它文件使用

//1.全集静态变量和局部静态变量都存储在静态区,都是在程序运行期间都是合法有效的
//2.局部静态变量符号的可见范围仅限于当前的函数内部,全局静态变量可见的范围从定义到文件的结尾
void test01()
{
        static int c = 30; //静态区
}

//头文件不参与编译,每一个.c文件,我们叫做一个编译单元
//编译器独立编译每一个.c文件
//头文件不要放定义,只能放声明
void test02()
{
        //声明,表示告诉编译器这个符号是存在的,你先让我编译通过,让链接器取找到底这个符号在哪
        //如果链接器发现还是没有会报错
        //extern int g_a;

        //printf("g_a = %d\n",g_a);
}

//-------------------------
//常量区 字符串常量 全局const变量

//1.const全局变量在常量区,不能修改(直接或者间接)
const int g_c = 100;
void test03()
{
        //直接修改不行
        //g_c = 200;

        //间接修改也不行
        int *p = (int *)&g_c;
        *p = 300;
        printf("g_c = %d\n",g_c);

        //全局const放在常量区,一旦修改,不能修改
}
//2.const局部变量
void test04()
{
        //局部常量在栈上,不能直接被修改
        const int a = 100;
        //a = 200;

        //局部常量在栈上,能间接被修改
        int *p = (int *)&a;
        *p = 200;

        printf("a = %d\n",a);
}
void test05()
{
        //hello world! char*类型字符串
        char *p = "hello world!";
        printf("%d\n", &"hello world!");
        printf("%d\n", p);
}
int main(int argc, char const *argv[])
{
        test05();
        return 0;
}
